﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using LiquidacionComisionSOA.Persistencia;
using LiquidacionComisionSOA.Dominio;

namespace LiquidacionComisionSOA
{
    public class Agentes : IAgentes
    {
        private AgenteDAO dao =  new AgenteDAO();

        public Agente crearAgente()
        {
            Agente agente = new Agente();            
            try
            {
                agente.Codigo = dao.ObtenerId();
            }
            catch (Exception)
            {
                agente = null;                
            }
            return agente;
        }

        public string registrarAgente(Agente agente)
        {
            String resultado = string.Empty;
            try
            {
                //Validación de existencia de agente
                if (dao.Obtener(agente.Codigo) != null) {
                    throw new Exception(Constantes.EXISTE_AGENTE);
                }
                else if (dao.ExisteAgenteCorreo(agente.Mail))
                {
                    throw new Exception(Constantes.CORREO_EXISTE_AGENTE);
                }
                else if (dao.ExisteAgenteRuc(agente.Ruc))
                {
                    throw new Exception(Constantes.RUC_EXISTE_AGENTE);
                }
                dao.Crear(agente);
                resultado = Constantes.PROCESO_CORRECTO;

            }catch(Exception  ex){
                return ex.Message.ToString();
            }
            return resultado;
        }

        public string modificarAgente(Agente agente)
        {
            String resultado = string.Empty;
            try
            {
                if (dao.Obtener(agente.Codigo) == null)
                {
                    throw new Exception(Constantes.NO_EXISTE_AGENTE);
                }
                dao.Modificar(agente);
                resultado = Constantes.PROCESO_CORRECTO;

            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
            return resultado;
        }

        public Agente obtenerAgente(string codigo)
        {
            Agente agente = null;
            try
            {
                agente = dao.Obtener(codigo);                
            }
            catch (Exception)
            {
                agente = null;
            }
            return agente;
        }

        public List<Agente> listarAgente(string ruc, string nombre)
        {
            String resultado = string.Empty;
            List<Agente> lstAgente = new List<Agente>();
            List<Agente> lstResultado = new List<Agente>();
            try
            {
                lstAgente = dao.ListarTodos().ToList<Agente>();
                foreach(Agente agente in lstAgente){
                    if ((agente.Ruc.ToUpper().Contains(ruc.ToUpper()) && !ruc.Equals(string.Empty)) || (agente.Nombre.ToUpper().Contains(nombre.ToUpper())&& !nombre.Equals(string.Empty)) || (ruc.Equals(string.Empty) && nombre.Equals(string.Empty))) {
                        lstResultado.Add(agente);
                    }
                }
                resultado = Constantes.PROCESO_CORRECTO;

            }
            catch (Exception )
            {
                return lstResultado;
            }
            return lstResultado;
        }

        public string eliminarAgente(string codigo)
        {
            String resultado = string.Empty;
            try
            {
                Agente agente = dao.Obtener(codigo);
                if (agente == null)
                {
                    throw new Exception(Constantes.NO_EXISTE_AGENTE);
                }
                dao.Eliminar(agente);               
                resultado = Constantes.PROCESO_CORRECTO;
            }
            catch (Exception ex)
            {
                return ex.Message.ToString();
            }
            return resultado;
        }

    }
}
